#pragma once
#include "common.h"

class IAlgebra
{
public:
	virtual BYTE add(BYTE a, BYTE b) const = 0;
	virtual BYTE mult(BYTE a, BYTE b) const = 0;
	virtual BYTE zeroElement() const = 0;
	virtual BYTE unityElement() const = 0;
	virtual size_t cardinality() const = 0;
};


class RingZ256 : public IAlgebra
{
public:
	BYTE add(BYTE a, BYTE b) const
	{
		return a + b;
	}

	BYTE mult(BYTE a, BYTE b) const
	{
		return a * b;
	}

	BYTE zeroElement() const
	{
		return 0;
	}

	BYTE unityElement() const
	{
		return 1;
	}

	size_t cardinality() const
	{
		return 256;
	}

};